home *** CD-ROM | disk | FTP | other *** search
/ PC-X 1997 October / pcx14_9710.iso / swag / files.swg / 0103_File Protection using Encrypt-Decrypt.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1997-05-30  |  40.5 KB  |  1,222 lines

  1. {$M 16000,0,0}
  2. Program FP;
  3. Uses
  4.   Crt, Dos,UTILS,ALLMIX,process;  { support files are contained in the XX3402 Code below }
  5. label 1,2;
  6.  
  7. Const
  8.         BufSize                =        512;
  9.         Version                =        '1.3';
  10.         MaxError    =        7;
  11.  
  12. Const
  13.   S = '           ';
  14.   archive = $20;
  15.  
  16. const
  17.     MajorVer = '1';                     { Current major version number }
  18.     MinorVer = '95';                    { Current minor version number }
  19.     Year     = 1991;                    { Release year }
  20.  
  21. {$IFDEF MsDos}
  22.     fsDirectory = 64;                   { Set directory length }
  23.     faReadOnly = ReadOnly;              { Set directory flags }
  24.     faHidden = Hidden;
  25.     faSysFile = SysFile;
  26.     faVolumeID = VolumeID;
  27.     faDirectory = Directory;
  28.     faArchive = Archive;
  29.     faAnyFile = AnyFile;
  30. {$ENDIF}
  31.  
  32. {$IFDEF MsDos}
  33. type
  34.         TRegisters = Registers;                                { Used for DOS calls }
  35.     TSearchRec = SearchRec;             { Used for search record }
  36. {$ENDIF}
  37.  
  38. Type
  39.         EDMode                        =        (EnCrypt,EnCryptPass,DeCrypt);
  40.         String79                =        String[79];
  41.         FilePaths                =        Array [1..2] Of String79;
  42.         Errors                        =        1..(MaxError - 1);
  43.  
  44.  
  45. Var
  46.   List         : Array[1..200] of String[15];
  47.   AttrList     : Array[1..200] of String[15];
  48.   filattr      : ARRAY[1..200] OF CHAR;
  49.   COUNT,Pos, First   : Integer;
  50.   C            : Char;
  51.   Cont         : Integer;
  52.   DirInfo      : SearchRec;
  53.   NumFiles     : Integer;
  54.   I,J:INTEGER;
  55.   key:char;
  56.   lasts,LAST,pass:string[15];
  57.   pass1:string[2];
  58.   NEW,point:integer;
  59.   delcount:integer;
  60.   F: file;
  61.   Attr: Word;
  62.   lines:word;
  63.   command:string[25];
  64.  _file:filepaths;
  65.  
  66. Procedure WriteXY( X,Y : Byte; S : String79 );
  67. Begin        (* WriteXY *)
  68.         GotoXY(X,Y);
  69.         Write(S);
  70. End;        (* WriteXY *)
  71.  
  72. Procedure Rm( FileName : String79 );
  73. Var
  74.         F : File;
  75.  
  76. Begin        (* Rm *)
  77.         If (FileName = '') Then Exit;
  78.         Assign(F,FileName);
  79.         Erase(F);
  80. End;        (* Rm *)
  81.  
  82. Procedure Center( Y : Byte; S : String; OverWriteMode : Errors );
  83. Var
  84.         X : Byte;
  85.  
  86. Begin        (* Center *)
  87.         GotoXY(1,Y);
  88.         Case (OverWriteMode) of
  89.                 1        : For X := 2 To 78 Do WriteXY(X,WhereY,' ');
  90.                 2        : ClrEOL;
  91.         End;        (* Case *)
  92.         X := ((79 - Length(S)) Div 2);
  93.         If (X <= 0) Then X := 1;
  94.         WriteXY(X,Y,S);
  95. End;        (* Center *)
  96.  
  97.  
  98. Procedure OutError( S : String79; X,OWM : Errors );
  99. Var
  100.         T : String79;
  101.  
  102. Begin        (* OutError *)
  103.         GotoXY(1, WhereY);
  104.         Case ( X ) Of
  105.                 1        : T := ('Incorrect Number of parameters.');
  106.                 2        : T := ('Input file "'+ S +'" not found.');
  107.                 3        : T := ('Input and Output files conflict.');
  108.                 4        : T := ('User Aborted!');
  109.                 5        : T := ('Input file "'+ S +'" is corrupted!');
  110.                 6        : If (T = '') Then T := ('DOS Input/Output Failure.')
  111.                                 Else T := S;
  112.         End;        (* Case *)
  113.         TextColor(LightRed);
  114.         Center(WhereY,T,OWM);
  115.         TextColor(LightGray);
  116.         If (OWM = 1) Then WriteLn;
  117.         Halt(x);
  118. End;        (* OutError *)
  119.  
  120.  
  121. Procedure GetStr( Var S : String79; Prompt,FName : String79; Show : Boolean );
  122. Var
  123.         Max,
  124.         Min        : Byte;
  125.         A        : Char;
  126.         X        : Byte;
  127.  
  128. Begin        (* GetStr *)
  129.         If (FName = '') Then
  130.         Begin
  131.                 Max := 54;
  132.                 Min := 0
  133.         End Else
  134.         Begin
  135.                 Max := 25;
  136.                 Min := 3
  137.         End;
  138.         TextColor(LightGray);
  139.        WriteXY(1,WhereY,Prompt);
  140.         Repeat
  141.                 GotoXY(Length(Prompt) + 1,WhereY);
  142.                 ClrEOL;
  143.                 If (Show) Then WriteXY(Length(Prompt) + 1,WhereY,S)
  144.                 Else For X := 1 To Length(S) Do Write(#249);
  145.                 A := (ReadKey);
  146.                 Case ( A ) of
  147.                         #32..#126 :
  148.                                 If (Length(S) < Max) Then S := S + A
  149.                                 Else
  150.                                 Begin
  151.                                         Sound(100);
  152.                                         Delay(12);
  153.                                         NoSound;
  154.                                 End;
  155.                         #8 :
  156.                                 If (Length(S) > 0) Then
  157.                                         Delete(S,(Length(S) ), 1);
  158.                         #0 :
  159.                                 A := ReadKey;
  160.                         #27:
  161.                                 Begin
  162.                                         Rm(FName);
  163.                                         OutError('',4,2);
  164.                                 End;
  165.                 End;        (* Case *)
  166.         Until (A = #13) And (Length(S) >= Min);
  167. End;        (* GetStr *)
  168.  
  169. Procedure GraphIt( Var F1, F2        : File;
  170.                                    Var OldX                : Byte;
  171.                                    Hour,
  172.                                    Min,
  173.                                    Sec,
  174.                                    Sec100                : Word;
  175.                                    BoxSetUp                : Boolean );
  176. Var
  177.         F1Size,
  178.         F2Size        : LongInt;
  179.         Percent,
  180.         X,
  181.         NewX        : Byte;
  182.         H,
  183.         M,
  184.         S,
  185.         S100        : Word;
  186.         A,
  187.         B,
  188.         C,
  189.         D,
  190.         Temp        : String79;
  191.  
  192. Begin        (* GraphIt *)
  193.         If (BoxSetUp) Then
  194.         Begin
  195.                 Percent := 0;
  196.                 OldX := 1;
  197.          {       GotoXY(1,WhereY);
  198.                 WriteLn('╔═════════════════════════════════════════════════════════════════════════════╗');
  199.                 WriteLn('║                                                                             ║');
  200.                 WriteLn('╚═════════════════════════════════════════════════════════════════════════════╝');}
  201.             {    GotoXY(3,WhereY - 2);}
  202.         End Else
  203.         Begin
  204.            textattr:=red+(16*white);
  205.                 GetTime(H,M,S,S100);
  206.                 If (Sec100 <= S100) Then Dec(S100,Sec100)
  207.                         Else
  208.                         Begin
  209.                                 S100 := (S100 + 100 - Sec100);
  210.                                 If (S > 0) Then Dec(S);
  211.                         End;
  212.                 If (Sec <= S) Then Dec(S,Sec)
  213.                         Else
  214.                         Begin
  215.                                 S := (S + 60 - Sec);
  216.                                 If (M > 0) Then Dec(M);
  217.                         End;
  218.                 If (Min <= M) Then Dec(M,Min)
  219.                         Else
  220.                         Begin
  221.                                 M := (M + 60 - Min);
  222.                                 If (H > 0) Then Dec(H);
  223.                         End;
  224.                 If (Hour <= H) Then Dec(H,Hour)
  225.                         Else H := (H + 12 - Hour);
  226.                 Str(H,A);
  227.                 Str(M,B);
  228.                 Str(S,C);
  229.                 Str(S100,D);
  230.                 Case (S100) of
  231.                         0..9        : D := ('0' + D);
  232.                 End;        (* Case *)
  233.                 If (M > 0) Then
  234.                 Case (S) of
  235.                         0..9        : C := ('0' + C);
  236.                 End;        (* Case *)
  237.                 If (H > 0) Then
  238.                 Case (M) of
  239.                         0..9        : B := ('0' + B);
  240.                 End;        (* Case *)
  241.                 If (H = 0) Then
  242.                 Begin
  243.                         If (M = 0) Then Temp := (Concat(C,'.',D,' sec') )
  244.                         Else Temp := (Concat(B,' min ',C,'.',D,' sec') );
  245.                 End
  246.                 Else If (H = 1) Then Temp := (Concat(A,' hr ',B,' min ',C,'.',D,' sec') )
  247.                                 Else Temp := (Concat(A,' hrs ',B,' min ',C,'.',D,' sec') );
  248.             F1Size := FileSize(F1);
  249.                 F2Size := FileSize(F2);
  250.                 If (F2Size <= F1Size) Then
  251.                 Percent := ((F2Size * 100) Div F1Size )
  252.                         Else Percent := 100;
  253.                 NewX := (((Percent * 76) Div 100) + 2);
  254.                 If (NewX < 3) Then NewX := 3;
  255.                 textattr:=lightred+(16*white);   {*************************}
  256. {**}            For X := OldX To NewX Do WriteXY(X,{WhereY}23,#249);{}
  257.                 OldX := NewX;
  258.                 textattr:=9+(16*white);
  259.                 Center({WhereY}1 + {1}23,(#181 + ' ' + Temp + ' ' + #198),5);
  260.                 GotoXY(NewX,WhereY - 1);
  261.         End;
  262. End;        (* GraphIt *)
  263.  
  264. Function Shrink( P : PathStr ) : String79;
  265. Var
  266.         D        : DirStr;
  267.         N        : NameStr;
  268.         E        : ExtStr;
  269.  
  270. Begin        (* Shrink *)
  271.         FSplit(P,D,N,E);
  272.         Shrink := N + E;
  273. End;        (* Shrink *)
  274.  
  275. Function UpStr( S : String ) : String;
  276. Var
  277.         X        : Byte;
  278.  
  279. Begin        (* UpStr *)
  280.         For X := 1 To Length(S) Do
  281.                 S[x] := (UpCase(S[x]) );
  282.         UpStr := S;
  283. End;        (* UpStr *)
  284.  
  285. Procedure EnCode( _File : FilePaths; Protect : Boolean );
  286. Var
  287.         Seed,
  288.         PI,
  289.         Y,
  290.         OldX                : Byte;
  291.         I,
  292.         Increment        : Integer;
  293.         Buf                        : Array [1..BufSize] of Char;
  294.         Hour,
  295.         Min,
  296.         Sec,
  297.         Sec100,
  298.         Status                : Word;
  299.         Temp,
  300.         Pass                : String79;
  301.         F1,
  302.         F2                        : File;
  303.  
  304. Begin        (* EnCode *)
  305.         Pass := '';
  306.     {$I-}
  307.         Assign(F1, _File[1]);        (* input file  *)
  308.         Assign(F2, _File[2]);        (* output file *)
  309.         Reset(F1,1);
  310.         {CheckError('','Couldn''t open input file.');}
  311.         ReWrite(F2,1);
  312.         {CheckError(_File[2],'Couldn''t create output file.');}
  313.         Randomize;
  314. {**}    If (Protect) Then
  315.         Begin
  316.        gotoxy(61,18);
  317.        readln(pass);
  318. {                GetStr(Pass,'(3 Char min, 25 Char max) Enter Password: ',_File[2],False);}
  319.                 Buf[1] := Chr(Random(127) );
  320.                 BlockWrite(F2,Buf[1],SizeOf(Buf[1]),Status);
  321.                 {CheckError(_File[2],'Couldn''t write to output file.');}
  322.         End Else
  323.         Begin
  324.                 Buf[1] := Chr(Random(127) + 127);
  325.                 BlockWrite(F2,Buf[1],SizeOf(Buf[1]),Status);
  326.                 {CheckError(_File[2],'Couldn''t write to output file.');}
  327.         End;
  328.         Seed := Ord(Buf[1]);
  329.         Increment := 1;
  330.         PI := 1;
  331.         Y := 127;
  332.     {TextColor(LightGray);
  333. {        ClrEOL;}
  334.         GetTime(Hour,Min,Sec,Sec100);
  335.         GraphIt(F1,F2,OldX,Hour,Min,Sec,Sec100,True);
  336.         Repeat
  337.                 BlockRead(F1, Buf, BufSize, Status);
  338.                 {CheckError(_File[2],'Couldn''t read input file.');}
  339.                 {CheckAbort(_File[2]);}
  340.                 GraphIt(F1,F2,OldX,Hour,Min,Sec,Sec100,False);
  341.                 For I := 1 To BufSize Do
  342.                         Begin
  343.                                 If (Protect) Then
  344.                                         Begin
  345.                                                 Buf[I] := Char(Byte(Buf[I]) XOR Byte(Pass[PI]));
  346.                                                 If (PI = Length(Pass)) Then Increment := -1;
  347.                                                 If (PI = 1) Then Increment := 1;
  348.                                                 Inc(PI,Increment);
  349.                                         End
  350.                                 Else
  351.                                         Begin
  352.                                                 Buf[I] := Char(Byte(Buf[I]) XOR Y);
  353.                                         End;
  354.                         End;
  355.                 BlockWrite(F2, Buf, Status);
  356.                 {CheckError(_File[2],'Couldn''t write to output file.');}
  357.         Until (Status < BufSize);
  358.         Close(F1);
  359.         {CheckError(_File[2],'Couldn''t close input file.');}
  360.         Close(F2);
  361.         {CheckError(_File[2],'Couldn''t close output file.');}
  362.         {$I+}
  363. (* Successful Encryption *)
  364.         TextColor(LightGray);
  365.         Temp := (Shrink(_File[1]) +' Encoded to '+ Shrink(_File[2]));
  366.         If (Protect) Then Temp := (Temp + ' with Password.');
  367.         Center(WhereY,Temp,1);
  368.        { GotoXY(1,WhereY + 1);}
  369. {        WriteLn;}
  370. End;        (* EnCode *)
  371.  
  372. Procedure DeCode( _File : FilePaths );
  373. Var
  374.         Seed,
  375.         PI,
  376.         Y,
  377.         OldX                : Byte;
  378.         I,
  379.         Increment        : Integer;
  380.         Buf                        : Array [1..BufSize] of Char;
  381.         Hour,
  382.         Min,
  383.         Sec,
  384.         Sec100,
  385.         Status                : Word;
  386.         Temp,
  387.         Pass                : String79;
  388.         F1,
  389.         F2                        : File;
  390.  
  391. Begin        (* DeCode *)
  392.         Pass := '';
  393.         {$I-}
  394.         Assign(F1, _File[1]);
  395.         Assign(F2, _File[2]);
  396.         Reset(F1,1);
  397.         {CheckError('','Couldn''t open input file.');}
  398.         ReWrite(F2,1);
  399.         {CheckError(_File[2],'Couldn''t create output file.');}
  400.         BlockRead(F1,Buf[1],SizeOf(Buf[1]),Status);
  401.         {CheckError(_File[2],'Couldn''t read input file.');}
  402.         Seed := Ord(Buf[1]);
  403.         If (Buf[1] < #127) Then (* There's a Password *)
  404.  {               GetStr(Pass,'Enter Password: ',_File[2],False);}
  405.        gotoxy(61,18);
  406.        readln(pass);
  407.         Increment := 1;
  408.         PI := 1;
  409.         Y := 127;
  410.         TextColor(LightGray);
  411.         ClrEOL;
  412.         GetTime(Hour,Min,Sec,Sec100);
  413.         GraphIt(F1,F2,OldX,Hour,Min,Sec,Sec100,True);
  414.         Repeat
  415.                 BlockRead(F1, Buf, BufSize, Status);
  416.                 {CheckError(_File[2],'Couldn''t read input file.');}
  417.                 GraphIt(F1,F2,OldX,Hour,Min,Sec,Sec100,False);
  418.                 {CheckAbort(_File[2]);}
  419.                 For I := 1 To BufSize Do
  420.                         Begin
  421.                                 If (Pass <> '') Then (* There's a Password *)
  422.                                         Begin
  423.                                                 Buf[I] := Char(Byte(Buf[I]) XOR Byte(Pass[PI]));
  424.                                                 If (PI = Length(Pass)) Then Increment := -1;
  425.                                                 If (PI = 1) Then Increment := 1;
  426.                                                 Inc(PI,Increment);
  427.                                         End
  428.                                 Else
  429.                                         Begin
  430.                                                 Buf[I] := Char(Byte(Buf[I]) XOR Y);
  431.                                         End;
  432.                         End;
  433.                 BlockWrite(F2, Buf, Status);
  434.                 {CheckError(_File[2],'Couldn''t write to output file.');}
  435.         Until (Status < BufSize);
  436.         Close(F1);
  437.         {CheckError(_File[2],'Couldn''t close input file.');}
  438.         Close(F2);
  439.         {CheckError(_File[2],'Couldn''t close output file.');}
  440.         {$I+}
  441. (* Successful Decryption *)
  442.         Center(WhereY,Shrink(_File[1]) +' Decoded to '+ Shrink(_File[2]),1);
  443.         GotoXY(1,WhereY + 1);
  444.       {  WriteLn;}
  445. End;        (* DeCode *)
  446.  
  447.  
  448.  
  449.  
  450.  
  451. function DeleteFile(FN : PathStr) : Boolean;
  452. var
  453.   Regs : Registers;
  454. begin
  455.   FN := FN + #0;          { Add NUL chr for DOS }
  456.   Regs.AH := $41;
  457.   Regs.DX := Ofs(FN) + 1; { Add 1 to bypass length byte }
  458.   Regs.DS := Seg(FN);
  459.   MsDos(Regs);
  460.   DeleteFile := NOT (Regs.Flags AND $0 = $0)
  461. end;
  462.  
  463. PROCEDURE BOX;
  464. BEGIN
  465. textattr:=9+(16*0);
  466. FOR J:=1 TO 24 DO
  467. FOR I:=1 TO 80 DO
  468.  BEGIN
  469.  GOTOXY(I,J);
  470.  WRITELN('█');
  471.  END;
  472. textattr:=white+(16*0);
  473. FOR I:=1 TO 80 DO
  474. BEGIN
  475. GOTOXY(I,1);
  476. WRITELN('█');
  477. GOTOXY(I,23);
  478. WRITELN('█');
  479. END;
  480. textattr:=black+(16*white);
  481. GOTOXY(3,1);
  482. WRITELN('File Protection, Encoder/Decoder Ver 1.1');
  483. {GOTOXY(16,23);
  484. WRITELN('E-Encode File, D-Decode File, Esc Exit Utility');
  485.  
  486. {TEXTCOLOR(WHITE);
  487. TEXTBACKGROUND(BLACK);     }
  488. textattr:=white+(16*9);
  489. FOR I:=1 TO 27 DO
  490.  BEGIN
  491.  GOTOXY(2+I,3);
  492.  WRITELN('─');
  493.  GOTOXY(2+I,20);
  494.  WRITELN('─');
  495.  END;
  496. FOR J:=1 TO 16 DO
  497.  BEGIN
  498.  GOTOXY(2,3+J);
  499.  WRITELN('│');
  500.  GOTOXY(29,3+J);
  501.  WRITELN('│');
  502.  END;
  503.  GOTOXY(29,3);
  504.  WRITELN('┐');
  505.  GOTOXY(29,20);
  506.  WRITELN('┘');
  507.  GOTOXY(2,3);
  508.  WRITELN('┌');
  509.  GOTOXY(2,20);
  510.  WRITELN('└');
  511. textattr:=9+(16*0);
  512. for j:=1 to 16 do
  513. for i:=1 to 26 do
  514. begin
  515. gotoxy(2+i,3+j);
  516. writeln('█');
  517. end;
  518. EnableHighBgd;
  519. textattr:=10+(16*9);
  520. GOTOXY(4,3);
  521. WRITELN('List');
  522. textattr:=9+(16*9);
  523. gotoxy(3,19);
  524. writeln('                          ');
  525. SHADOW(20,3,20,29);
  526. SHADOW(3,29,20,29);
  527. END;
  528.  
  529. PROCEDURE BOX2;
  530. BEGIN
  531. textattr:=white+(16*9);
  532. FOR I:=1 TO 37 DO
  533.  BEGIN
  534.  GOTOXY(40+I,3);
  535.  WRITELN('─');
  536.  GOTOXY(40+I,5);
  537.  WRITELN('─');
  538.  END;
  539.  GOTOXY(40,4);
  540.  WRITELN('│');
  541.  GOTOXY(77,4);
  542.  WRITELN('│');
  543.  GOTOXY(77,3);
  544.  WRITELN('┐');
  545.  GOTOXY(77,5);
  546.  WRITELN('┘');
  547.  GOTOXY(40,3);
  548.  WRITELN('┌');
  549.  GOTOXY(40,5);
  550.  WRITELN('└');
  551. textattr:=9+(16*0);
  552. for i:=1 to 36 do
  553. begin
  554. gotoxy(40+i,4);
  555. writeln('█');
  556. end;
  557. textattr:=10+(16*9);
  558. gotoxy(42,3);
  559. writeln('Last Modification');
  560. gotoxy(42,4);
  561. writeln(last);
  562. SHADOW(3,77,4,77);
  563. SHADOW(5,41,5,77);
  564. END;
  565.  
  566. PROCEDURE BOX3;
  567. BEGIN
  568. textattr:=white+(16*9);
  569. FOR I:=1 TO 37 DO
  570.  BEGIN
  571.  GOTOXY(40+I,7);
  572.  WRITELN('─');
  573.  GOTOXY(40+I,10);
  574.  WRITELN('─');
  575.  END;
  576.  GOTOXY(40,8);
  577.  WRITELN('│');
  578.  GOTOXY(77,8);
  579.  WRITELN('│');
  580.  GOTOXY(40,9);
  581.  WRITELN('│');
  582.  GOTOXY(77,9);
  583.  WRITELN('│');
  584.  GOTOXY(77,7);
  585.  WRITELN('┐');
  586.  GOTOXY(77,10);
  587.  WRITELN('┘');
  588.  GOTOXY(40,7);
  589.  WRITELN('┌');
  590.  GOTOXY(40,10);
  591.  WRITELN('└');
  592. textattr:=9+(16*9);
  593. FOR J:=1 TO 2 DO
  594. for i:=1 to 36 do
  595. begin
  596. gotoxy(40+i,7+J);
  597. writeln('█');
  598. end;
  599. textattr:=10+(16*9);
  600. gotoxy(42,7);
  601. writeln('User Information');
  602. SHADOW(7,77,9,77);
  603. SHADOW(10,41,10,77);
  604. textattr:=lightgreen+(16*9);
  605. GOTOXY(42,8);
  606. WRITELN('E- Encode File');
  607. GOTOXY(42,9);
  608. WRITELN('D- Decode File');
  609.  
  610. GOTOXY(60,8);
  611. WRITELN('Del- Delete File');
  612. GOTOXY(60,9);
  613. WRITELN('Esc -Exit');
  614. END;
  615.  
  616.  
  617. PROCEDURE DELdir;
  618. BEGIN
  619. lines:=0;
  620. if pos<15 then
  621.   pass:=list[pos]
  622. else
  623. pass:=list[cont-1];
  624. textattr:=white+(16*9);
  625. gotoxy(3,23);
  626. write('Do You Wish To Remove Thise Directory And All Its Contents [y/n]');
  627. key:=readkey;
  628. IF (KEY='Y') OR (KEY='y') THEN
  629. BEGIN
  630. Assign(f,pass);
  631. SetFAttr(f, Archive);
  632. NukeDir (pass,true, false,false,faAnyFile,lines);
  633. LAST:=PASS;
  634. END
  635. ELSE
  636. IF (KEY='N') OR (KEY='n') THEN
  637. BEGIN
  638. lasts:=pass;
  639. END;
  640. END;
  641.  
  642.  
  643.  
  644. PROCEDURE MAIN;
  645. begin
  646.   TextBackground(Black);
  647.   TextColor(LightGray);
  648. {  ClrScr;}
  649.  
  650.   For Cont := 1 to 15 do
  651.   begin
  652.     List[Cont] := '';
  653.     AttrList[Cont] := '';
  654.   end;
  655.  
  656.   NumFiles := 0;
  657.   FindFirst('*.*', AnyFile, DirInfo);    {replace here path to *.*}
  658.  
  659.   While (DosError = 0) do
  660.   begin
  661.     Inc(NumFiles, 1);
  662.     List[NumFiles] := Concat(DirInfo.Name,
  663.                       Copy(S, 1, 12 - Length(DirInfo.Name)));
  664.     If (DirInfo.Attr = $10) Then
  665.       AttrList[NumFiles] := '<DIR>'
  666.     Else
  667.       Str(DirInfo.Size, AttrList[NumFiles]);
  668.     AttrList[NumFiles] := Concat(AttrList[NumFiles],
  669.                           Copy(S, 1, 6 - Length(AttrList[NumFiles])));
  670.     FindNext(DirInfo);
  671.   end;
  672.  
  673.   First := 1;
  674.   Pos   := 1;
  675. END;
  676.  
  677. PROCEDURE DIRCHANGE;
  678. BEGIN
  679.  command:='cd..';
  680.  SwapVectors;
  681.  Exec(GetEnv('COMSPEC'), '/C ' + Command);
  682.  SwapVectors;
  683. END;
  684.  
  685. PROCEDURE DIRCHANGE1;
  686. BEGIN
  687.  command:='cd '+pass;
  688.  SwapVectors;
  689.  Exec(GetEnv('COMSPEC'), '/C ' + Command);
  690.  SwapVectors;
  691. END;
  692.  
  693. PROCEDURE userinf;
  694. BEGIN
  695. textattr:=white+(16*9);
  696. FOR I:=1 TO 37 DO
  697.  BEGIN
  698.  GOTOXY(40+I,12);
  699.  WRITELN('─');
  700.  GOTOXY(40+I,20);
  701.  WRITELN('─');
  702.  END;
  703. FOR I:=1 TO 7 DO
  704. BEGIN
  705.  GOTOXY(40,12+I);
  706.  WRITELN('│');
  707.  GOTOXY(77,12+I);
  708.  WRITELN('│');
  709. END;
  710.  GOTOXY(77,12);
  711.  WRITELN('┐');
  712.  GOTOXY(77,20);
  713.  WRITELN('┘');
  714.  GOTOXY(40,12);
  715.  WRITELN('┌');
  716.  GOTOXY(40,20);
  717.  WRITELN('└');
  718. textattr:=9+(16*0);
  719. FOR J:=1 TO 7 DO
  720. for i:=1 to 36 do
  721. begin
  722. gotoxy(40+i,12+J);
  723. writeln('█');
  724. end;
  725. SHADOW(12,77,19,77);
  726. SHADOW(20,41,20,77);
  727.  
  728. textattr:=LIGHTGREEN+(16*9);
  729. GOTOXY(42,14);
  730. WRITELN('Source File Name : ',pass);
  731. _FILE[1]:=PASS;
  732. _File[1] := (UpStr(_File[1]) );
  733. GOTOXY(42,16);
  734. WRITE('Target File Name : ');
  735.  
  736. GOTOXY(61,16);
  737. WRITE('             ');
  738. GOTOXY(61,16);
  739. READLN(_FILE[2]);
  740. {GetStr(_File[2],'','',True);}
  741. _File[2] := (UpStr(_File[2]) );
  742. GOTOXY(42,18);
  743. WRITELN('File Password    : ');
  744. END;
  745.  
  746.  
  747. PROCEDURE CONFIRM_ENCODE;
  748. BEGIN
  749. lines:=0;
  750. if pos<15 then
  751.   pass:=list[pos]
  752. else
  753. pass:=list[cont-1];
  754. textattr:=WHITE+(16*9);
  755. FOR I:=1 TO 57 DO
  756.  BEGIN
  757.  GOTOXY(10+I,7);
  758.  WRITELN('─');
  759.  GOTOXY(10+I,9);
  760.  WRITELN('─');
  761.  END;
  762.  GOTOXY(10,8);
  763.  WRITELN('│');
  764.  GOTOXY(67,8);
  765.  WRITELN('│');
  766.  GOTOXY(67,7);
  767.  WRITELN('┐');
  768.  GOTOXY(67,9);
  769.  WRITELN('┘');
  770.  GOTOXY(10,7);
  771.  WRITELN('┌');
  772.  GOTOXY(10,9);
  773.  WRITELN('└');
  774. textattr:=9+(16*0);
  775. for i:=1 to 56 do
  776. begin
  777. gotoxy(10+i,8);
  778. writeln('█');
  779. end;
  780. textattr:=10+(16*9);
  781. gotoxy(12,7);
  782. writeln('Encode File Confirmation [y/n]');
  783. gotoxy(42,4);
  784. writeln(last);
  785. SHADOW(7,67,8,67);
  786. SHADOW(9,11,9,67);
  787.  
  788. textattr:=white+(16*9);
  789. GOTOXY(12,8);
  790. WRITELN('Do You Wish To Encode File : ',pass); {<----}
  791. key:=readkey;
  792. if (key='N') OR (key='n') THEN
  793. BEGIN
  794. END
  795. ELSE
  796. if (key='Y') OR (key='y') THEN
  797. BEGIN
  798. {MAIN CODE HERE}
  799. userinf;
  800. EnCode(_file,true);
  801. END;
  802. END;
  803.  
  804. PROCEDURE CONFIRM_DECODE;
  805. BEGIN
  806. lines:=0;
  807. if pos<15 then
  808.   pass:=list[pos]
  809. else
  810. pass:=list[cont-1];
  811. textattr:=WHITE+(16*9);
  812. FOR I:=1 TO 57 DO
  813.  BEGIN
  814.  GOTOXY(10+I,7);
  815.  WRITELN('─');
  816.  GOTOXY(10+I,9);
  817.  WRITELN('─');
  818.  END;
  819.  GOTOXY(10,8);
  820.  WRITELN('│');
  821.  GOTOXY(67,8);
  822.  WRITELN('│');
  823.  GOTOXY(67,7);
  824.  WRITELN('┐');
  825.  GOTOXY(67,9);
  826.  WRITELN('┘');
  827.  GOTOXY(10,7);
  828.  WRITELN('┌');
  829.  GOTOXY(10,9);
  830.  WRITELN('└');
  831. textattr:=9+(16*0);
  832. for i:=1 to 56 do
  833. begin
  834. gotoxy(10+i,8);
  835. writeln('█');
  836. end;
  837. textattr:=10+(16*9);
  838. gotoxy(12,7);
  839. writeln('Decode File Confirmation [y/n]');
  840. gotoxy(42,4);
  841. writeln(last);
  842. SHADOW(7,67,8,67);
  843. SHADOW(9,11,9,67);
  844.  
  845. textattr:=white+(16*9);
  846. GOTOXY(12,8);
  847. WRITELN('Do You Wish To Decode File : ',pass); {<----}
  848. key:=readkey;
  849. if (key='N') OR (key='n') THEN
  850. BEGIN
  851. END
  852. ELSE
  853. if (key='Y') OR (key='y') THEN
  854. BEGIN
  855. {MAIN CODE HERE}
  856. userinf;
  857. deCode(_file);
  858. END;
  859. END;
  860.  
  861. PROCEDURE DELFILE;
  862. BEGIN
  863. if pos<15 then
  864.   pass:=list[pos]
  865. else
  866. pass:=list[cont-1];
  867.  
  868. textattr:=BLACK+(16*WHITE);
  869. GOTOXY(1,23);
  870. WRITE('Do You Wish To Delete File [y/n] : ',pass);
  871. REPEAT
  872. key:=READKEY;
  873. UNTIL (KEY='N') OR (KEY='n') OR (KEY='Y') OR (KEY='y');
  874. IF (KEY='Y') OR (KEY='y') THEN
  875.  BEGIN
  876.  Assign(F, pass);
  877.  SetFAttr(F, Archive);          { For Windows: faArchive }
  878.  DeleteFile(pass);
  879.  LAST:=PASS;
  880.  END
  881. ELSE
  882. IF (KEY='N') OR (KEY='n') THEN
  883.  BEGIN
  884.  END;
  885. END;
  886.  
  887. BEGIN
  888. 2:TEXTMODE(CO80);
  889. 1:BOX;
  890. BOX2;
  891. BOX3;
  892. MAIN;
  893.   Repeat
  894.     For Cont := First To First + 15 do
  895.     begin
  896.       If (Cont - First + 1 = Pos) Then
  897.       begin
  898.         TextBackground(Blue);
  899.         TextColor(Yellow);
  900.       end
  901.       Else
  902.       begin
  903.       textattr:=lightgreen+(16*9);
  904.  
  905.       end;
  906.       GotoXY(5, Cont - First + 4);
  907.       Write(' ', List[Cont], '  ', AttrList[Cont]);
  908.     end;
  909.     C := ReadKey;
  910.     If (C = #72) Then
  911.       If (Pos > 1) Then
  912.         Dec(Pos, 1)
  913.       Else
  914.       If (First > 1) Then
  915.         Dec(First,1);
  916.  
  917.     If (C = #80) Then
  918.       If (Pos < 15) Then
  919.         Inc(Pos, 1)
  920.       Else
  921.       If (First + 15 < NumFiles) Then
  922.         Inc(First,1);
  923.  
  924.     IF (C=#27) THEN
  925.     begin
  926.     textmode(co80);
  927.     EXIT;
  928.     end;
  929.  
  930.     IF (C='D') OR (C='d') THEN
  931.     begin
  932.     CONFIRM_DECODE;
  933.     GOTO 1;
  934.     end;
  935.  
  936.     IF (C='E') OR (C='e') THEN
  937.     begin
  938.     CONFIRM_ENCODE;
  939.     GOTO 1;
  940.     end;
  941.  
  942.     IF (C=#13) THEN
  943.     BEGIN
  944.     if pos<15 then
  945.     pass1:=list[pos]
  946.     else
  947.     pass1:=list[cont-1];
  948.     if pass1='..' then
  949.      begin
  950.      DIRCHANGE;
  951.      goto 1;
  952.      end
  953.     else
  954.      begin
  955.      if pos<15 then
  956.      pass:=list[pos]
  957.      else
  958.      pass:=list[cont-1];
  959.      dirchange1;
  960.      goto 1;
  961.      end;
  962.     END;
  963.  
  964.     IF (C=#83) THEN
  965.     BEGIN
  966.     if pos<15 then
  967.     pass1:=list[pos]
  968.     else
  969.     pass1:=list[cont-1];
  970.      Delfile;
  971.      goto 1;
  972.     END;
  973.  
  974.   Until (Ord(c) = 13);{}
  975. END.
  976.  
  977. GetStr(_File[1],'Enter Input Path/File : ','',True);
  978. _File[1] := (UpStr(_File[1]) );
  979. GetStr(_File[2],'Enter Output Path/File : ','',True);
  980. _File[2] := (UpStr(_File[2]) );
  981. {EnCode(_file,true);}
  982. decode(_file);
  983.  
  984. { the following contains additional files that should be included with this
  985.   file.  To extract, you need XX3402 available with the SWAG distribution.
  986.  
  987.   1.     Cut the text below out, and save to a file  ..  filename.xx
  988.   2.     Use XX3402  :   xx3402 d filename.xx
  989.   3.     The decoded file should be created in the same directory.
  990.   4.     If the file is a archive file, use the proper archive program to
  991.          extract the members.
  992.  
  993. { ------------------            CUT              ----------------------}
  994.  
  995.  
  996. *XX3402-011488-090697--72--85-13646----------FP.ZIP--1-OF--3
  997. I2g1--E++++++D6IjG6++++++++++++++++4++++JIt7J3AjI2g1-+c++++++2EJjG8h8+UJ
  998. 5++++-k++++8++++IYJ-F2p39ZFMJ2N7H2IUFIt1HoF39oF3Eox2FG-JJ2ZAGJFN1EdEGkA2
  999. 3++0++U+QopO6gxWMi0r2+++M06++-++++-JHYZIImx-H2lBGJUiJ3-JjJZvQ7FJZXzrSzLL
  1000. bItrVm+4N+6P2PCkViu61W6WSHK77DEfsGKpEomOD0cYP1wUePKmMLJXW6HJRKh4aJ9EMJm9
  1001. -GQmp0kuCt-0bf6nEy21JuHKcFlbK+7M03If7BpvnjpiRvcvMQPxNnhobyzwviySSwuttxvv
  1002. TFyprXcTsCQWf6AxxcKC6zXr+TvRQZVn7iJQbEGkkMnB4g+aQst3VzzfdlgQNfQt6U5spCqa
  1003. Bwpfx7+mHzx64a0PpOWam7wertA-TeMxclyGWLx-vpAyIGyfcBqZYPu1csSpAteevxBZoqHH
  1004. TOO5HIyPfe-Lnq5PCmf+8ZC9CH5SKiKYSN2uO+7Mm-7ME0idfeudKUJEC5UH0Va5+ZrVG5+1
  1005. UCKcXU1y0wVZzZdAlARtv8OVZrg0+DTzcN1dX5GpffOe4d3PIM+wEflNapcOUlphkIUY48dV
  1006. km1V5kqvaXIk1Hflec2vsRAA1eOjVbKmrv+s-ygXYJ19InVw1P8aQB-ftWMrpXQ3xuB-em9l
  1007. 09UJvCp52Zsv-VVN4cPLw3j6j3OXIoR9Ckvm0K7uhU75Y2AqYbu4UUoRcQOPVdyCWlGpZ0Jd
  1008. Q6wo3oT7cWZWbHX6HLODN5XXMprcrIoqBu2ft7Ui6NGoPHWwjeIhu744EM2SK0mF1KfoG0IZ
  1009. vo2QP4I9ptNuD9LJbeJ3hOheeO4oB9D-upx-1KJZp70B1SIJeFr8mnBkHrItsFIJV3gFfkbU
  1010. V-IxwA+1-9jR-4QVX3lDIK-ps+XnG2iL2ad5B3-FKyQJtVR95eamAi3Dc8umb-f8GzWsJJK7
  1011. QR34PIJBYGj+wGSSG7ce8pZSLVJMJcGxe4LNgYGDtQY6TWLtK7IclnYWhoy+Z8cfcK-H4-B6
  1012. bnLm10l0bpnT5cMwXZ1BuAkb9uhM1JCHW2TquGh84Vh1kL+Mdb5s2tttblucrlFosul+DcTT
  1013. Y4PUbDbAMMFdgZnEbgEzZbqadycXa1oL5C9cGMIP6LFnGvg9HaOWyAw3NxDEQ3SsgGDgUgwn
  1014. IKvVemHO75AIzvbUunEi2j5D-PQm9L-IMEbI8WKLBh10dpJV-Ygm8kSEAop-Dngu6aoRHK1X
  1015. x1nJg9QlpB4ocPsRZr+0zLDq3CGwdjVIhBLG++KQ5-7fa4Aii1Q71YUyIrZ9e8dxTETAsiUP
  1016. 7dtutUMjpzilCjsPKGJhPHzk9mq3AllxLQpMvb7miTAhY3PU+59QWYzev66nGYfde+oRPFoV
  1017. C7i8OOgf+ggx9jV6GLKLUwLkwLXkETVYD1UTneK0IW++bme7gb3WWggwBHJMzJ0c2VfIodDt
  1018. RwZYxWGHuIDCJSl7JFi6VC+hrbBbFgygN2xfgiTnm5Z6xf2+53-HGZf0eZKo-71520W4qWEk
  1019. FoDUERWhdLKN1nSGk3sNUMSUr7H4S-XyCFrsDbmN-+dJ--P+T1qBwEUwakf6+NQHDgd+L119
  1020. b20KabnmWa+66VlNX02qeLvBLo2vsVPOvi3J926hKoYtHswUcunOLpvZNvc1xLz7M1-i4Qj6
  1021. ftRpPCmW5M1dh6LMgwO6J2gGo0sZwNzTOLsnAGguKw8F9TdAd5mOEUzlAiHAnP9TIVv2omlc
  1022. K0v2taz5IPY9Wi9DfaWjTuchKBbGp3nOpAVo7n9ihqO4RAvYhtKrVBCM0l-rXKBSpzkKqg10
  1023. 1O3Ug7rdGl-vB6AZ4ODHBWUBmztgr-cXSDEZiZHGDQKRiqVDGbsho3nTq94NuJtgCtiRnZKA
  1024. t4LwL+GzmJrT4DF26on5yklsltPdSuj7friX2LQ75jdALsT6R5guFnJGH0bAzDYdSJKmce8e
  1025. ZibBGDqVDRDwcnW3zcd+fQTDGFgFqXKCR75txEezryAjxOlWSWQW9sofgDzT4vNjfSBjq9GY
  1026. 9uZLFmrb9L4y7xBRG8GtM1-CbQH8oeYQOQyJbXJUr5DTgTXMSYbVCiqt3-5p97MCl-7R9mAb
  1027. 9-oM7NqmHmB4gpv9qccpvPA2Ce8V-Zvd-P5MCI4VVhfuI3AkMXGA7VeaNjYocsTInI2Oh-V-
  1028. Umr3FV9UiWmTKicDpXR86lmXdPwAWOIfEmqFc5Ef0R7tFOCIFhR9hqsESX9fXbS3Sj9wEks3
  1029. QX59G7tDdlCzjLt1Q9M4eXsKuKGfn9RLbyFSLj-qT7uSn8TWltgFOES5u4NYsXZtnVf4zYxO
  1030. mIogTNuDkTWyAHDaebOjQJROc+5VhAMef1tp-L2Z7yTGTGABiQ6TP708firHXRh51PumbYLH
  1031. vt7tfOdRK9wkNhq0Mkfn4BU3MLtrWjY9swpTo-BrdrugVZ+s01cRHhBGpfZlUZ8Ugv61qPz0
  1032. 3UyTVI+kQd2r4NwZsXjysv5sXJobckTkqnhZUVsyhOcRHoBd7DshVfgjCzooNAbHI2eSVewU
  1033. tlym8H2BnTIVuHPjG+oOC4pSqonPtxYogNqi+WiiuAHnVIzeQVJMYg0JP4EI3yXdX48Qf-E+
  1034. 3oUwbh-XqHvK6gKGihraMurGO37TMjCnBO1rcM5BhglhRan1pC-3qyjMjgL4bnfE+uxhPA+i
  1035. R0-J1ob1QR6HZHVWmv4TEvpCxvE5mvcOqc7qy8KhHeQZJRrFgN3qhXdHSP0-Z7yHUcRVSuGZ
  1036. DFew03zOuf0u6u23Q-qjJhOrFD9VZ8pC7OlsBhDgRGe-lJMQehvSOkzPXEZm9wQ3J+-lqfdc
  1037. +QqqynFzcuSxfEgnH01hp+jhDfamdF3Hb21sgRwJlUUHWATiIod01QoMN+e7yOLV4CZrKavo
  1038. WSB595fyQE0z7F5D0++nVGkIVS6Iyc8IYeJDdN1fV4kKQeDcpkb4ph4HsMRLO8jsvsTAmSZr
  1039. oK4BrsTMEJX8NEyrC-jxz-58Nx0DzGXjFPyCoud0SMsC89HnFtEzFHZ8nysMlmGgxTLcvlmI
  1040. at3LVf67tIeI7l1TWH86pUyWb6PlzUSXBlA79yKmI6FvarXUlwj2UnsSgB36GpiMwwcvkZWM
  1041. vHJf0Wk4hQVP2e0KEIM5JHL4KkDrUIKpUWrDl5zASKBz-elOfOft5ds0T0I+ayWFEN7AAdAN
  1042. MrGWPA5dSEvHsvBAAfgg2dXbsGqPFMNQg6B0izafq4ortaJy9WUmt2+q9j5I0tUlAwTVg4WU
  1043. a4XTdgSk1v0jVQYGkuwgGGUJqeEzktavUDaSCpjFJ6j1h+MlSiPu+xtKK1HJ8Xq1k-I2fb7+
  1044. goeonxt+s1MCBRRgnbLYHbIch1ieaB7gVe+XJtoulStEO4St4w3wNULvJ0r9-DVD-NKKt1n2
  1045. WpYqq-FEn4MfzZeb8PENnAK47Ik5auNCbntRIxm6JR3f39M6wsGVmEmRZmGUID04ZGZAcTQb
  1046. ecEHEtSdvH73muUs7JcW9m1zbr1EqTOz-6jBUNwgIBv2VZog0pv5EGrNBahCXWeRF4kD1jej
  1047. H22WxJQfEe4CIBrKrvi4Rh125QT0rbZ0cnrqgV75yHdmJD0qabbnMMluNSjFJi1OqAwnWk5Q
  1048. oRxCp15firFgLNMqkC3lD0GY4jfDwEEpnQ7b2l3G9ElBF90Y25syYExzaY17SqKW58FqCnxV
  1049. 1WeWjnL4m4cpsLSN1HS0JXB3PJmHuFSl8GJ4z94h54Tgp4bLoDOVqGSo2BPBETXOSz1fiDTo
  1050. OKLhb86tP0pCxA3eaFCr13T9qnvQzjuqwmA1rMD5BaZv3rZ0oe-bnsjC8xzgrbtysB0-YGYf
  1051. gKb8mgGMBiCexT4-vaQ3Gft1F9uo1reuTp6IZGzx00xSoT3WCzGvLtbZKCG6DbNbIkDRPkUA
  1052. CP2d8pgx8Ef3TPaGfCW9xAXX+sSIC3ft1fO21O8bu2aT9pL3mSp7oLhuiUSZeBPHjLxVl1ta
  1053. ogXX-kdEhfEgYGoh8t4hEv5MgIqKjIOWI-iZt6qZ9FMX9qCXkZfIRBkRNtSyE6SuFrZ99-Ym
  1054. +OpgP31nI6HMoeLxq-UPGPBX+-CktIjD7arTiX3ZNHDc+sR4Fh7nMFWXtjUjFX02Kqbhnm+T
  1055. 6dPbSoR45iqxBF6NBClZ4VXHYokB5J+i8zW9olozxM2CMrh7DiP3ySLSZz0Aqrfx67HxyWw4
  1056. wLFTAcBGmrVmpnCFrDIgKMdjHpG8CmWbrKxDACRj7sjaiDj57EDibqppvxdqNejvfM5i5M9y
  1057. j5jjTNGhEMWk7LriC5RIGL4IZengQ+rx-4jPkRSKK2eN34BhXyAQDCgEQNlpd0sdGoMQbBHL
  1058. KrFBLAmvRfFPor-SbBRcqVkWpQtsOc2PSfDYG7oBHXZIR0ql0cwe8EqdFQnbsvjuxlq4zfDX
  1059. 6sF-nHvua7OAe-wXxjNXhBszuOGK8+OBMLr4YfIyo1pKxzrioHvrvLvrvILiW97cTRFokVqH
  1060. sD9RVDUF0L22hpzJBPHJ5LjS5HjpDhaS9CdwSD7lxlLdiDgOKg9OfClnTxDjpjb3xJP5EDSk
  1061. Q+lNCf3GAHvdzStVvzUxxsVaF7+MFRi3oyiCouOhQzhMRWDxPWhS95GDP2Nhx96QQsxm7tPk
  1062. W0mwvTPauLri49L3yhol9sPffTgXVFr1hiUZp93zx-VKw-j7l6Y8TLQ7jDSNDDmK5faBDx5P
  1063. vtqEbIBLGohRtsTvbUAcqr6Pt8RjiAvr58MRKsbxMk8vahvhd1k6JojljTS6vpqEjqZTTT4h
  1064. IuSBtHdN2XAoKIfiVF+zhgaKgjgBowFBPYoImX1TZW+yTiJmg1YiHgvS8v4msvr1AMNfhzRK
  1065. P80LlPTqLczpR3hlLyfjzHdaNLrsqxBhGSWGcSg7LH3o9O5D7BrkFtGN3GkB0xQqVdi8BXLJ
  1066. XmLCBSExL8KMNjQwNcfOHaW7pEu1ZuodqY5iib42SwPe6TskDcLUBr34vonRB-95R1szmYuR
  1067. FWXLiEjjjz+4wUJuVdU2yUh2j3j64I6Ks8A8DOjAVJnGaFDvbQFyXu0YpyC9IPu+gYnkesHo
  1068. 0fZ8m0S3bINVdoLM0EYvasKRdkLzvkJzay0z8DUv-5ybsCwKj5q0hpzkTWZsEs7rHD-y6rUT
  1069. 0hvbUjQvkTh8w8s7rUr-4lIwWFYw2nBs1aPkva649twNj5g3fp1kL69rgC+x9bXZUcQrs5kS
  1070. DAm6jpP6hI9yEBVd3bMq01iPV7qz3LNu-9yLtHjdKLEPrbDHgy2C6RwIsykFxjM9Szxaj3G3
  1071. ToQvUqXbTK5rd91vOqPIWkrnE2xjWo5rsWAHnbiigtAzhlMumJ+h3D9lpkXSJgtHMPjUjGHY
  1072. emXd4LQDDVaFbJw6zgS0ztbUzNSEZp-KGjGEZChgFjaha8wMXjgmDLQnMxkQx5C7H5YrqVwE
  1073. TdiErsTh7Q9CYmWx2XpT6svh4kGyZTl+yIC-zlXZmp7e5O2xp9wEyiwd1hGN42xXVdsXx0ZW
  1074. T2qgBvC6wl4Agl0AxRAdwYXtw4+wSK1sNTGXyJFkbSdwrb83bcQwmhjrvg0P7DGdUdQDWHm+
  1075. Yxstz-J8SiTk2C9oPe7Ol9xKlBwesih+yELJZR1vF9kj0TpZ4AgjxTyym4i3O5w0lubYQSIu
  1076. wmFufq5UnK9QPf5S-cHRZoLvemZqzoSWxmV4TaMZQGAidt1ZMfpKWTJOWz7HyUxzMSyjly9b
  1077. yP29CELffwzMbvXyBqbtDADi3r8yY6w8iHdZDfx+zlsIwpeCwveFvsD4j0sLTewJwrdMxAjV
  1078. ReNVD0GbklmV3khx+ReVzcxlDFx8VNoecGwLj3fF1zRNzUtdfMVXLJcQyTXKmC+tY2TnAELy
  1079. 3p-9+kEI++6+0++7JJcWS2wjr9YF+++6Gk++2E+++3JCGJFH9p-GHoB3IpAiI23HnHlfXxiq
  1080. Zhw1t1ykE+17fS7sohji7fvSMX8DlgVYNa-BYaOn8I-9h8oPaHF6OeOyUznrtG2dWLfNQXTH
  1081. ***** END OF BLOCK 1 *****
  1082.  
  1083.  
  1084.  
  1085. *XX3402-011488-090697--72--85-26893----------FP.ZIP--2-OF--3
  1086. fhD4gYUS5VsSbXRnznruFbwSDp7zcwhrPwu4pwQVaaxFiA8Ic1S2QrHMlw6mbpCG2YY2kYVY
  1087. wnXV778APl4aAG8rV4zZ8e39Z2UIAGdlEgKk4xNZxcKU-SDcx0d2RnmFYZ-oYz2tExRMF1V3
  1088. DkpzucZL+Sh1EaBq7kdsaE028Z1RPYT1YEDfDS2WMJGxTO2bjaGrN1ob51rzAI-59psQxOTL
  1089. BzfnxT4XlswmaYWosGkWEckTDoec75m-6u7O--4D5xozaNuTbdqXhy8I0HKWq8mfQ+mhNtSb
  1090. ozCjNHyvSBhHzHeNrEHkfEM287EwcIhF4TbsIQGcY4P+KzkjlhwHXWP6Cz94fIGsFmQNtsF8
  1091. h6PSuBNGZaOObbPehkYh69rseFqI+kZuRo1uG91VusbSdkt6At6G9+XOEayxf1PG9QFdkRUH
  1092. xDAzleqkEW7FSE-GEdRmZKCnk1C0smiO+c1wQPkPkW93Gp20S7r2AO3ei5YMtyz1fHVDIe6O
  1093. v3DFwduZqNdAHpJHzZWoiEgebcjKMluhYZi+ONz83fepgxab4ZTImGSr4p9mrwqA9-AV0FSO
  1094. 1DNtjCw+rOBrUgG3N6VkaVO2iEY7JXXCG+EIm7z5LSC3vc5IUVaDoJQLyJjA1IXJaIzd7dDc
  1095. 7F8Oxnwt5D-tL69BJ2w3GqkM3EEt-yqMWXjJZ6wTxlSi5I0jy37Vg-iVSxIfKGMIdksLtKH0
  1096. T2bYjj2ZJoW482VECrl4pimKeC3nlZ80OTg7a0uQWL2YAtmaKvII4-ivt7YFYOJm5nXPWmo+
  1097. 3F1O1cG9V-6FfhURJJ1i46z5zEZwOEG3Udg030Eo4A5E+VTWspV8bglrkvt5yWVUrHI17GUN
  1098. WfIyh99Y4qhj9T5XX-BoTj9883uBUExzVlgG3Tgv49Tdu6Le7ek0Z0i0rcNDsHkdM4WFoIW0
  1099. 3DILb8oRjHQO1CrYaCApUTDu2VZ6Og7+DzZW+2iT2vjuq6mUH2qeCdxUWVW6DYgPUoN0BEuF
  1100. ZSI3skmziPMgpUMq+NkWjyHGwcEOBUoI6a8HsaqU3dk7ZyJ9thjrkJLaiQLQQddtAuU+HROP
  1101. Z8k7ZFVk-5kvhnabSaKPGkZv+lgtgP8hl1PaWHuuoEfnwOtnAJ81Mv9+KGc1R+EWDY1DpRQf
  1102. xy-Fj+NUa5CwzHEO1jzXAlmY2fMx39ePAsnw6RpFnqiXwa4e4u4OwtmlIQPbuNTigpUO-DCI
  1103. FJxeVU-wC6Z2wazG0S6SLP-Z+eOUJEmuRo9FT+jblc4oG3698KJoaJ+tPdI7bSBX9AYieL8D
  1104. Hf2x6iUC0tFW6EjHhP6WQSgGx4WY8EfnXEjdGTWhcnOf3CKOXMfyLFGpx60ZOBeu84+OgrIb
  1105. 7E+3owD0e4s9cT5MoPb+iWwp-sxnXPC2wp7O1DPx1JZjEiacJjDu2ex7G7O-TfVOt2RhL21L
  1106. XSevoXNLk0ZoiISz2cY2KQ7-pAs9Kmk2oQc5d3FlwfvKg7WIHHyUOALxoO082LFFQ5ovkarJ
  1107. e2nI387cJI0C8XXbkxKjERbUX0kOvh2dovUOlRioZ60WkyDTMC0Htmx46sTEkxAELZiIrMNk
  1108. aXScCRq4Anr063a-B9LjmzvO3jGVRH1iZXvLa+j9y77dTjXOE9-ZihwOotZpjhPfDDfl6-lC
  1109. GkK3B4I--y-ICBQJKRlev1uQjXx70SNjtetGpuy2rj2jN1hbaARcbWoKV5xn-Rf+knqtPESp
  1110. C3TJrFXZj1qZYjhDXbsCYBYFwzNidSaiRqZsffoTC6bbzoos4u+74UpEn59tsonFa4PYuCfq
  1111. eHclqnL2W0n91UqOJ7q7jt6tDi-2jW3PZnbUZR0G5kBreAt2W+TY0sj0+LnFiKZBuXQcPaTv
  1112. emZSq73HAGD4V0FlpI-oH4upt9IqyitKF8s6v6FOkN9XhET49vWLX0CKGLV8-C63m6QnU1gF
  1113. 9rPBqPZ1zDCw9vf3OJOpS26NHw37yzpJiurF-H8IaANMqlt+cGf28yqQzqaEZidTRr9YnwwD
  1114. +3ol5y6MXVjM1hTVhMitesIO37eUOwaBw5jpKs0S5DpbIpLRcqiKe0YYguAojRi6os1qkc3K
  1115. -EDx0nX4Z7UFaL48PaPjnZ0mg5AZFhg6ACqlm2TOiOigBI4y5jAvyiRzqMuztoTtPneoZxZu
  1116. -U3SOzGuVxKgpemC3g2-1fqNwJ73l+aV1yaNpd0f5AVEnzsVWSL8qes6nkJ9AoZ+QDtXx-9y
  1117. DVvLFsGZnxAqs8EdYEgw7gXrTER8bBmWcx3cB30saqxswxlwCTWpvz51vKabEnzM5JqeNEh+
  1118. M8hlP4hNT2CWN74E43In4XVBrJE4S1MN3wYhGPS3KbP17AJcW0P6JStBl4uMHIRBxBleibPQ
  1119. fARbsVDuH8dltfQ1eoxKdDBHF1pmwDO31RNUHNQhkfm6wFk0LMRGGhUagc6Lc1+6XZPqSDL1
  1120. 5M6f7imI-rBP+r-zYUsuHVAsIg+2PWkpp8dha9-DUckPgT6G3L8or0mhw5JQB21bllTV4K7U
  1121. 7BkZUXlgwiXzRn0g25jxshoVVU+5usluOp3cgkAjbJH-1VTkb54LiIdPtXFPfvQB0fn4B2u-
  1122. A1-aRtlsNPfuqWcrF6bIimINh-UWjl8d3imD+Yi7kLWjyR3CVV9YmEcU3cq1xe1vWIM71d6o
  1123. 8MAOIKqIrkW5F3-DHIk1x8xAmDncCLZTTwanxHkpGwkbGFP6donaI+MUKaWHcGcChyzxMXx1
  1124. xPw5m-TiCYVZ6uM8yyIwcP3ullJGSXD-zk5Hn46-nSTEubjT1vzrUYd0fBWS6CQRg3kAr+j4
  1125. BZcHuCE6dZgrutp+W7pZh2VpQ96VK3MLvjgKu--G1-eKAzY+v8LFE9zqHtYsstllszeeJxq7
  1126. LTRHH+-Faox5bk4YBzE4CNrrdLxrkljhU3SCeL4nneU6YGmdPktAEJcBR3+H7m4Fto0RcfB9
  1127. cFqWllvFGGvP8dUPxFCUopmYLFiZR4nrKaSIeh+7RQ9c7-L2vC0Tr7R1xWe5ShVC5P7vxFYu
  1128. lvQkf03NneiA6xyams+UUyNtzgPQABf3+qQQ0q8vhjRn7JV0Zs34JmQ-HRM0JdXEWCj0+3-J
  1129. 846NfLWUxEyklSZiOPOH4aqT1nmFt69uLdb0+sa8j8-AokP6ylxjBzLODZAOyGrgLjwMEvu1
  1130. U4+EOCd38l7xCM-CpwPs+k3bY2-fddtnnyAdSXskkPtjGobTixNCCQVgW6V7dgrsV4NYC-lu
  1131. TQVK-fZuvhp-p9JFfaHFn9G+ifcYToXToITkDZDsdsuSoCSlo3LHFNh7Y6UwtFdMwwBMt7lI
  1132. hkuqmVdVHcJ6ptsMqw61EfN6n+oHjgCnpe8-mdlSge8QM8QKQ51M9QKvVbNPKXePdiMZHFAn
  1133. BuAV0k3qj7oOZaq87ed9f0rjzgboOQhtaOpfeoKRZhyP72ovH9Jm6uRLhdN0Ouna3Xe9+0It
  1134. fW1skxTK+5X1YLVMJzy4jRhg06Ss2ewsyHoeP-nLvsHFKw8Z5EKgbqak2FM2cTv3XlIrDkGD
  1135. J-i1-Wcuf70mx-Ap9VcJ2synwM6yM9xziC1IDh6vPZiWrY6psd7k7pzfRbICU4aOE3hSLwMs
  1136. U7WU6xUNIo9buvlcaTUlsnsZbu5Tiwo7e5jv7XzrCQ9+neeZW2Yx86BS728SOmyY6ldZuP85
  1137. EE3ALeaXEotZQABKn9E3dyMYNLTR1Cf2cGel7m2lZmVJIk7zMPaLEQisWA2EVdNVevy9ETiG
  1138. TYS+MMS2vGueCwbsLVVZ8IJXS3atq-qPg8K9Ye43QKZBgM2cpQzukin-GwWQuJLiebWfP7hH
  1139. uvOjWCvS4jptZAp45ui-0kSN0FeBxtPThG3nQD0XNkHYqoEzujUN1VUQa0W8qXWW2PUcKkyA
  1140. LXX3ljeLfFnKnvN4C51WMnbX3TIZVPLNfuIK4M5hpAfEvCvyU2X1bJPjWUZqFIZu4MwJbWlz
  1141. z3+81KSmdUBJhR8pbpR-xzy0kJ5BW9JyWbvqQhv8LPkRC3cuxe7NVzpidrPIUxRzXdnPSYv-
  1142. JTSbI+xuk-G4VLhCgB8R1s-i1oJDw46f73Yrk9TtT8JDpyfBpQzL9bxijtCmlp2dZOH9ViD4
  1143. Q7rsdNomKWydIcpF+jvuk0PKOmn0ioF48yE9wxqGvSjV+o12kWHu6fNSMlczpS29n7SNfgEp
  1144. ZHBJKwhCq4ZWaTP+X17xkQ+m4Gc+RqWiG+jCk1XF7YC2zYMHesroI9vPYPtlzM-iLHWZATY1
  1145. AY67beRpMu8QgSNOJtq2OxW22kUwDHre9UzHUGQaTCgja0IAUhlHw1KII56zUTVZilVc2SoJ
  1146. 54iSgkt4zd56TE6VRuQNRscBKyVi4cTaW4ZQJ9wpJZyqf0XDnpln8CpMQa60VjaZfXmQ03Q+
  1147. bMgSc4bmypg-F6O1sV7K9dMeYIXzN80ukCoepFii2Q63EezKhP+8x32f8d-L7BrYFmv5GojZ
  1148. QVDFDm2cdDcL0zSxLnkHN6MBJ1w0JCnKoO1J38XhZ7LQ7VlHjuYM6+npmoXBhGd9TPJWe6Xs
  1149. UUWpV+z2oqktE3jzBUVu-nul1Kmky6ky3PVwvUjVmcnJuLUAoWdBqNpsqFf3R5PjXLbnVd0B
  1150. fLCcLBbIyTU6eVa-PpVaQaRWi+zguych2uBySsuRJQQKhY5DsK3pi35BDQQShpqCMEiRHWmx
  1151. va2v3m1ooJdr10sU7cgYojQro7kgEDr05UAJbu6MD+fCAj3RBo66+QHrtgpvkiRAZAZrBldE
  1152. MntRYv3vbQ+WyEqgdmWwiDfkrHv0L7grpypJ4gCyHDeFNGX0318xCZg81AQNQuzuhBBKLxqx
  1153. UvUaX1Jc7+ioJT1m6YYBf3N2KMLK8bdngEEL9Ph9D1eiaM39qtFfnxvYuftqJKuWgLT2q-ij
  1154. hCLmuqIRA3zLM68ER00xxVeyHkbEDXaSrvU-TvMPzekjzC6aOqC4QDQAMRwNr1ihZEaCRoxk
  1155. r7k+SZXEjFJwkNAbVd4-3M5pmiapra0ak1QL4fOhHEOpgSKiv2F7ZS9ivPXfaf7nPrJGugVG
  1156. hkvurDoqih8+eQE8XF-tWIdt+vhzETpWqY4hv0yjo8YJoNbvOD+Y1SEm1IL7LRBlOIO1wZDY
  1157. N2yAQpF-dN5wOCtuau3U1Nqk7Qc8581Bwec6fHda5G8c10HMZ2dPCAbQoXoobBGUafoCN6ho
  1158. 4d2g69qZyFn1SM6PbsZgK6ftdS32U74MsxMayvhcQN0HOf+4cg4qJHI3aVDEde-58dOXHF3M
  1159. rB+2zRVjUlrRd8qldavufYjjynQ8bTCfqRjXay3kCD1qv5Wl4mk15wRYmuqFQ5dqAZJUddSz
  1160. ReTiOYfYcnTcbHAhYHtKYs5u1BzBnjH15HPJrpSj9eMrNvDX4m--6edAoaob+-rQTxp1-lQn
  1161. 4VCC2jb9RycDwXwyilkMKP4jC8OwJBFRXa7ZXPZLrsNLTiByIjVoPLpR6q0uEBuK0+xkxvOS
  1162. OdC2EnoazDvccT11xCPYBF72-fY-UmLON7hBMtBwP4OTe63bcLJLb5RSrOLFqxVD39q0-eet
  1163. bxppZGfY3yf9oWRn7+7fXUHitCyxEP0zVg2NQCrNi0kkcpjcDuWJHqZ9eSDQ8BHL66pozHCF
  1164. Kv0whWnX83el769mm3i0pcF5KmWupmq0NOavLe7kQ7pbJpoq9b9Y-531-pKI9dZVrtVFAhlx
  1165. XhKoCV-HW0Y6SZavL7QmqddcFnH-OsB35t3In3P8PMnKF+WwpANjhKkQPUO5vuujfw8nIph1
  1166. rj8j95HJ6CmnRQkz2sEKK0ojRd6x3FkCef9cARh89SY9qQWxgvFitEosvhc9VUqpfVl5feyY
  1167. 3U5-2jVDJXpZc3CN1GVpGKgci-6AiKGIC818jMB6lm79oEd0ALzdxfLb38P4TPd9l8eucTP8
  1168. fEWAAOPEv+dgyxunpk3uBUio85UK6Vj+09c564H1eAyCPSxRypa7XI4c8sxjeNzz0p-9+kEI
  1169. ++6+0+0XP9YWRnWuUo66++0H3U++1k+++3JCGJFH9pJIGIlH9Z--IwJMSqzPC-9zjo0zklkE
  1170. ***** END OF BLOCK 2 *****
  1171.  
  1172.  
  1173.  
  1174. *XX3402-011488-090697--72--85-19075----------FP.ZIP--3-OF--3
  1175. s76B5QWCYvPqxWtCb4mRGpeXHfj33Pq0ZiW6XGE86dLMOzEXrbSu4J8G7HyuSvU3HbwYob+S
  1176. jrZkCDFmPr16nZhgq48LVymelLtdgJ49rFmmhmrqfgLShxWYlHsSgYy5rtwzKyvREhRvRQcw
  1177. tbo5KB7ryzHsNFQ7dmQbluQSzBlGIT16cpkUzsR24gWBX5ETZX-Rk9I82vURkgG6B-G7JUYU
  1178. aomAm4PQ3mWVVMOVoikWAzrbnx+YL8YA-BQ9mAFAN09l-FU31q8VGTPtAvB6IF-U806Nry25
  1179. j2NKLqI-IE3Ae59BYo+nxlo6LwMw8fys2QKfYP5c+QwmjjXg5Fqpjs0OkIL6gnuhWmGkU++i
  1180. wWkfvCl5UeBWe1x9o6hseW762MI6o-wP1U9Ps+CHQMkAOwcurYeoI9IVOypyNRjgAh+dld9h
  1181. AjhpoqtVhd9QNHIHOMEA-zquO22AL1NQF4SlcSVwa+nMNNudJ9-fbj9Yc6mUmVCH9PMYOsX0
  1182. aD0M4uix-vzWIfw-pSg-uMJq1kfRoCa-pJwWdUlBb+xCGtLIPXCdFRJ66n6cK8gmudQ47m9Z
  1183. 4HQeorLx1NFZGTEfZ9zm-TV63Maz+8ZVNhaB0pCdMmXjdR43XjC32IpDWqKNf1GJkd5m5nfR
  1184. A8i2ZMc2HzcfsPgAYmxboCaqEdJbs7B67QypiCLd-MwW7txa0ZCMNmijPtFum3AkT-c7EUy1
  1185. mQJc-5y1jNRSeEOnlKyYBVWVhHWrpyBwAFfK8uY5HtFMhzNSO72xMaVUDJojRit-Jo4XN8PU
  1186. BHF8m2TTU-N4kltAAOWccWnYRUzqFwC7z2pgcb-DeLWsMnIEMrsjhgjSVQ60QWKlej41Wei1
  1187. xXyY3DovWWj4LRbaRx-kvt3bBFzTDRH1JYzoYZWW++8-8a8N0D0R0DsDA4YFjrSN8XGx3rtB
  1188. Imq2pjchbnz7k6EgtjBEmDjEZ2J7elAz2m8d6ZTPb9N9zzhDSl1ki0l4C6xYwj-iBihj2dA4
  1189. vS7apASYssfMrvgO51ELwomfP3pBEGIxJrbW4uYGi7k9DnRWzmqD-HBQFdUVPY7hgcD8qsft
  1190. GYPWQWupoTgnT2os5FxXN7xMxX7HelB8qlUOpzJKBTvepGhPtZALuswiylBl5mBngx7Q3bUE
  1191. N1rspoeRLPhFhePKxa5bFJorkALvAMCPiv5Rx8vsP+N5QFc7AgX7Bu6wTtNiWG-kfIKARYWA
  1192. utVolicFSAVUnqivefHQA0g1xPpYwiT6R6KDvOc42j32fMqMOsQJUc8xhZRpgcwm2+cgp0lD
  1193. 1H4JCmLRnCPz19-xoXq4DlzUlCGn4LKmTFx1vyD9kSxUDOZEFElwOwaDs1KyKVFn-CIXclzO
  1194. ZF-Lj1eyolK89FieMLc7PtIFM27iw+xmrR0FFKzQBnaD6-DrIeBv18OtUTArw3K5p5ey+cyo
  1195. UeY+XR2mmW4cSo6NPrjSQIaM2g51dlP6rI0HznjCxizUT0xs30aT4r2fMdIhxgSMrL5NpK3E
  1196. EnxktatFCkkyAFVbMWPb2r3TIGwb13SenrBYceoDeQZUTBWlynRCkLMWFqEqXhSouwzSzMDS
  1197. FsZDYjW8V7th4jbIuOed5fl-xvc17q++xXfKoKjT8geBPGV0+kl509EGgsP5ODWBsCZZ2f1V
  1198. OCTOMMRRHWmAr00Cmm7oivchI9i3JPyhNfwh6FnbChlWPyTGtU8Nr0N+x2re5I9PlYrovIPl
  1199. zmswyBwaYaOjxSed3WNDDDocT-cu8xdEuGA8qEyNhaag8UspL4ONgjPToQEve8fWCjYBAnxI
  1200. WJWfYK4xFa07-YmS7G-61sqaHl8hHUKx1Xv-jdk-HlM5hV3NRRhHzkTDndr75peDPk6BA72A
  1201. DdR8jdExyNMz01SmzhAplIw63kMVyViuon9EIoiz0CxVA4RkDZxhD7cO8JyT7z9kTDu3UJSh
  1202. 1N3p6ZR-kgzigSS3XQbx3q4+6+2r7dDHr6XWva+1qKa58za6kFKDh3VhjnNgD2jYYR5TGloy
  1203. qOI+hrhUEu7Gg04VzaGtez0uKxati7Q7QGtFKffayKVD9NcZVBMZDYlTl9K7OLtw1Gy6AE3R
  1204. X08xpv-rvbYS0AHPd9vojDtel04ZF2xBhZykARjorNmv3QXryUl8kXfrzTp6vHz776XtzC0U
  1205. LoMKjqGQlo+fuUZGdGIJZKPk32cz-7tFDmkJZfBgcH4IRMp9Wm+inT6YUBLsOym7ELRleQJT
  1206. bA9O56kO8xuTGVIzRIXdtawKafH3ud3ax1WabmCCmUhn9FHqhaIjWz+VxPaKGHb-NmbNCphB
  1207. wavaAstQn5uKJdledDRmXbcldICZsJ3YabPSnr-wJ3rUu8GXVkOCMmxoF7asOqpFdU-yb1ei
  1208. 09YQuRjI3SNNivFJhWXs8uJ6n6p6+V3IBl8Ni-gkEjXfqi-JUn3bQ5fWZLMd3DMr4gZcParm
  1209. HiSgpKuGUXaPndgYTwuuvFpiTTBzv2A7DF+dyM9WzsoHbL+1PyoSRZHS71QwO16JZx2aJsqX
  1210. i56SLMm418Irb6SHDynwSGuX+4sIrIu9OzzrnHnQr6orXPnokgoMy+IODr6LwvDXbWBccpnf
  1211. 7JVykJxMIgeKqhblKZnEgdfBO5UffnahHOhPcEEp80YR5IHHVPZ+PwhBvMNS6Aub3Rw9sEmQ
  1212. RLiPDdQNa2TQfCqRCfNjIF5wYmMHMGp1wIooSSNyS3xWs4i73ffrSHcz1CELV-1ht1wvuHL1
  1213. 5em5jJj2GFJshChE8oiTelwZo-Hxl3G+9FksunV1vRsDl8fX1hZvexwxwCwFaTgDI2g-+VE+
  1214. 3+++++++wVGx6U++++++++++++++++M++++++++++E+k+++++++++3JCGJFH9p-9+E6I++c+
  1215. +++++2EJjG8h8+UJ5++++-k++++8++++++++++2+6++++0E+++-GFI32HIIiJ3VII2g-+VE+
  1216. 3++0++U+QopO6gxWMi0r2+++M06++-+++++++++++++U++++O++++3JCGJFH9o3AH2p7K0tI
  1217. I3JEGk203++I++6+0++7JJcWS2wjr9YF+++6Gk++2E+++++++++-+0++++-B2E++JIt7J3Aj
  1218. I37DEoJHImtEEJBEGk203++I++6+0+0XP9YWRnWuUo66++0H3U++1k+++++++++-+0+++++p
  1219. 6k++JIt7J3AjJJF7H3AiI23HI2g3-U+++++3++I+7U2++8Ef++++++++
  1220. ***** END OF BLOCK 3 *****
  1221.  
  1222.